Buka kekuatan Scrapy untuk pengikisan web yang efisien dan terukur. Pelajari cara mengekstrak data, menangani kompleksitas, dan membangun solusi pengikisan yang kuat untuk kebutuhan data global.
Kerangka Kerja Scrapy: Panduan Anda untuk Pengikisan Web Skala Besar
Di dunia yang digerakkan oleh data saat ini, kemampuan untuk mengekstrak informasi dari web sangat berharga. Baik Anda melakukan riset pasar, memantau aktivitas pesaing, atau membangun aplikasi kaya data, pengikisan web menawarkan solusi yang ampuh. Scrapy, kerangka kerja Python yang kuat dan fleksibel, menonjol sebagai alat terkemuka untuk membangun solusi pengikisan web skala besar. Panduan komprehensif ini akan mengeksplorasi fitur, manfaat, dan praktik terbaik Scrapy, memungkinkan Anda memanfaatkan potensinya untuk kebutuhan ekstraksi data Anda.
Apa itu Scrapy?
Scrapy adalah kerangka kerja perayapan web sumber terbuka yang ditulis dalam Python. Ia dirancang untuk menangani kompleksitas pengikisan web, menyediakan cara terstruktur dan efisien untuk mengekstrak data dari situs web. Tidak seperti skrip sederhana yang mungkin mudah rusak karena perubahan situs web, Scrapy menawarkan arsitektur yang kuat yang dapat beradaptasi dengan struktur web yang berkembang dan menangani tantangan pengikisan umum.
Mengapa Memilih Scrapy untuk Pengikisan Skala Besar?
Scrapy menawarkan beberapa keuntungan yang membuatnya ideal untuk proyek pengikisan web skala besar:
- Arsitektur Asinkron: Arsitektur asinkron Scrapy memungkinkannya untuk menangani banyak permintaan secara bersamaan, secara signifikan meningkatkan kecepatan dan efisiensi pengikisan. Hal ini sangat penting saat berurusan dengan sejumlah besar halaman yang akan di-scrape.
- Dukungan Middleware: Scrapy menyediakan sistem middleware yang fleksibel yang memungkinkan Anda menyesuaikan proses pengikisan. Anda dapat menambahkan middleware untuk menangani tugas-tugas seperti rotasi agen pengguna, manajemen proxy, percobaan ulang permintaan, dan caching HTTP.
- Pemrosesan Saluran Data: Saluran data Scrapy memungkinkan Anda memproses data yang di-scrape dengan cara terstruktur. Anda dapat menentukan saluran untuk membersihkan, memvalidasi, mengubah, dan menyimpan data dalam berbagai format dan basis data.
- Dukungan Bawaan untuk Pemilih XPath dan CSS: Scrapy menawarkan dukungan bawaan untuk pemilih XPath dan CSS, sehingga mudah untuk mengekstrak data dari dokumen HTML dan XML.
- Ekstensibilitas: Scrapy sangat ekstensibel, memungkinkan Anda menyesuaikan dan memperluas fungsinya dengan komponen dan ekstensi khusus.
- Dukungan Komunitas: Scrapy memiliki komunitas yang besar dan aktif, menyediakan banyak sumber daya, tutorial, dan dukungan untuk pengembang.
Arsitektur Scrapy: Memahami Komponen Inti
Untuk menggunakan Scrapy secara efektif, penting untuk memahami komponen intinya dan bagaimana mereka berinteraksi:
- Laba-laba: Laba-laba adalah jantung dari proyek Scrapy. Mereka menentukan cara merayapi situs web, URL mana yang akan diikuti, dan cara mengekstrak data dari halaman. Laba-laba pada dasarnya adalah kelas Python yang mendefinisikan logika pengikisan.
- Mesin Scrapy: Mesin Scrapy adalah inti dari kerangka kerja. Ia mengelola aliran data antara semua komponen lainnya.
- Penjadwal: Penjadwal menerima permintaan dari Mesin dan memutuskan permintaan mana yang akan diproses berikutnya berdasarkan prioritas dan faktor lainnya.
- Pengunduh: Pengunduh bertanggung jawab untuk mengambil halaman web dari internet. Ia menggunakan permintaan asinkron untuk mengunduh banyak halaman secara bersamaan secara efisien.
- Laba-laba: (Ya, disebutkan lagi untuk kejelasan) Laba-laba memproses halaman yang diunduh dan mengekstrak data. Mereka kemudian menghasilkan item data yang diekstraksi atau permintaan baru untuk dirayapi.
- Saluran Item: Saluran Item memproses item data yang diekstrak. Ia dapat digunakan untuk membersihkan, memvalidasi, mengubah, dan menyimpan data.
- Middleware Pengunduh: Middleware Pengunduh adalah komponen yang berada di antara Mesin dan Pengunduh. Mereka dapat digunakan untuk memodifikasi permintaan sebelum dikirim ke server dan untuk memproses respons sebelum dikirim ke Laba-laba.
- Middleware Laba-laba: Middleware Laba-laba adalah komponen yang berada di antara Mesin dan Laba-laba. Mereka dapat digunakan untuk memodifikasi permintaan yang dihasilkan oleh Laba-laba dan untuk memproses respons yang diterima oleh Laba-laba.
Menyiapkan Lingkungan Scrapy Anda
Sebelum Anda dapat mulai menggunakan Scrapy, Anda perlu menyiapkan lingkungan pengembangan Anda. Inilah caranya:
1. Instal Python:
Scrapy memerlukan Python 3.7 atau lebih tinggi. Anda dapat mengunduh Python dari situs web resmi Python: https://www.python.org/downloads/
2. Instal Scrapy:
Anda dapat menginstal Scrapy menggunakan pip, penginstal paket Python:
pip install scrapy
3. Buat Proyek Scrapy:
Untuk membuat proyek Scrapy baru, gunakan perintah scrapy startproject:
scrapy startproject myproject
Ini akan membuat direktori baru bernama myproject dengan struktur berikut:
myproject/
scrapy.cfg # File konfigurasi Scrapy
myproject/
__init__.py
items.py # Mendefinisikan struktur data untuk item yang di-scrape
middlewares.py # Menangani pemrosesan permintaan dan respons
pipelines.py # Memproses item yang di-scrape
settings.py # Mengonfigurasi pengaturan Scrapy
spiders/
__init__.py
Membangun Laba-laba Scrapy Pertama Anda
Mari kita buat laba-laba Scrapy sederhana untuk mengekstrak data dari situs web. Untuk contoh ini, kita akan meng-scrape judul dan URL artikel dari situs web berita.
1. Tentukan Struktur Data Anda (Item):
Di items.py, tentukan struktur data untuk item yang di-scrape Anda:
import scrapy
class ArticleItem(scrapy.Item):
title = scrapy.Field()
url = scrapy.Field()
2. Buat Laba-laba Anda:
Di direktori spiders, buat file Python baru (misalnya, news_spider.py) dan definisikan kelas laba-laba Anda:
import scrapy
from myproject.items import ArticleItem
class NewsSpider(scrapy.Spider):
name = "news"
allowed_domains = ["example.com"] # Ganti dengan domain target Anda
start_urls = ["https://www.example.com"] # Ganti dengan URL target Anda
def parse(self, response):
for article in response.css("article"): # Sesuaikan pemilih CSS sesuai kebutuhan
item = ArticleItem()
item['title'] = article.css("h2 a::text").get()
item['url'] = article.css("h2 a::attr(href)").get()
yield item
Penjelasan:
name: Nama laba-laba, yang akan Anda gunakan untuk menjalankannya.allowed_domains: Daftar domain yang diizinkan untuk dirayapi laba-laba.start_urls: Daftar URL yang akan mulai dirayapi laba-laba.parse(self, response): Metode ini dipanggil untuk setiap halaman yang diunduh. Ia menerima objekresponse, yang berisi konten HTML dari halaman tersebut. Anda menggunakan pemilih CSS (atau XPath) untuk mengekstrak data yang diinginkan dan membuat instanceArticleItem.
3. Jalankan Laba-laba Anda:
Untuk menjalankan laba-laba Anda, gunakan perintah berikut di direktori proyek Anda:
scrapy crawl news -o articles.json
Ini akan menjalankan laba-laba news dan menyimpan data yang diekstrak ke file JSON bernama articles.json.
Menangani Tantangan Pengikisan Web Umum
Pengikisan web tidak selalu mudah. Situs web sering menggunakan teknik untuk mencegah pengikisan, seperti:
- Robots.txt: File yang menentukan bagian mana dari situs web yang tidak boleh dirayapi. Selalu hormati robots.txt!
- Deteksi User-Agent: Situs web dapat mengidentifikasi dan memblokir permintaan dari alat pengikisan yang dikenal berdasarkan tajuk User-Agent.
- Pemblokiran IP: Situs web dapat memblokir alamat IP yang membuat terlalu banyak permintaan dalam waktu singkat.
- CAPTCHA: Situs web dapat menggunakan CAPTCHA untuk mencegah akses otomatis.
- Konten Dinamis: Situs web yang sangat bergantung pada JavaScript untuk memuat konten dapat sulit untuk di-scrape dengan metode tradisional.
Berikut adalah beberapa strategi untuk mengatasi tantangan ini:
1. Hormati Robots.txt:
Selalu periksa file robots.txt dari situs web yang Anda scrape dan patuhi aturannya. Anda dapat menemukannya di /robots.txt (misalnya, https://www.example.com/robots.txt).
2. Gunakan Rotasi User-Agent:
Rotasi tajuk User-Agent Anda untuk meniru berbagai browser web dan hindari diidentifikasi sebagai scraper. Anda dapat menggunakan UserAgentMiddleware Scrapy untuk mengelola rotasi User-Agent dengan mudah. Daftar User-Agent yang valid dapat ditemukan secara online. Contoh:
# settings.py
USER_AGENT_LIST = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:89.0) Gecko/20100101 Firefox/89.0',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]
# middlewares.py
import random
class RotateUserAgentMiddleware(object):
def process_request(self, request, spider):
ua = random.choice(spider.settings.get('USER_AGENT_LIST'))
if ua:
request.headers['User-Agent'] = ua
# Aktifkan middleware di settings.py
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.RotateUserAgentMiddleware': 400,
}
3. Gunakan Rotasi Proxy:
Gunakan server proxy untuk menutupi alamat IP Anda dan menghindari pemblokiran IP. Anda dapat menggunakan daftar proxy gratis (meskipun ini seringkali tidak dapat diandalkan) atau berlangganan layanan proxy berbayar. HttpProxyMiddleware Scrapy dapat digunakan untuk mengelola rotasi proxy. Ingatlah untuk meneliti dan menggunakan penyedia proxy yang memiliki reputasi baik. Contoh:
# settings.py
PROXIES = [
'http://user:password@proxy1.example.com:8080',
'http://user:password@proxy2.example.com:8080',
'http://user:password@proxy3.example.com:8080',
]
# middlewares.py
import random
class ProxyMiddleware(object):
def process_request(self, request, spider):
proxy = random.choice(spider.settings.get('PROXIES'))
if proxy:
request.meta['proxy'] = proxy
# Aktifkan middleware di settings.py
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.ProxyMiddleware': 750,
}
4. Terapkan Penundaan:
Hindari membuat permintaan terlalu cepat untuk mencegah kelebihan beban server dan memicu pembatasan kecepatan. Gunakan pengaturan DOWNLOAD_DELAY Scrapy untuk menambahkan penundaan antar permintaan. Pertimbangkan untuk menyesuaikan penundaan ini berdasarkan responsivitas situs web. Contoh:
# settings.py
DOWNLOAD_DELAY = 0.25 # 250 milidetik
5. Tangani CAPTCHA:
CAPTCHA dirancang untuk mencegah akses otomatis. Memecahkan CAPTCHA secara terprogram bisa jadi menantang. Pertimbangkan untuk menggunakan layanan pemecahan CAPTCHA (berbayar) atau menerapkan solusi human-in-the-loop di mana seorang manusia memecahkan CAPTCHA saat muncul.
6. Gunakan Splash untuk Konten Dinamis:
Untuk situs web yang sangat bergantung pada JavaScript, pertimbangkan untuk menggunakan Splash, layanan rendering JavaScript. Splash memungkinkan Anda untuk merender halaman di browser tanpa kepala dan kemudian meng-scrape HTML yang dirender sepenuhnya. Scrapy memiliki dukungan bawaan untuk Splash.
Penyimpanan dan Pemrosesan Data dengan Saluran Item
Saluran Item Scrapy menyediakan mekanisme yang ampuh untuk memproses data yang di-scrape. Anda dapat menggunakan saluran untuk:
- Membersihkan dan memvalidasi data
- Mengubah data
- Menyimpan data dalam berbagai format dan basis data
Untuk menentukan Saluran Item, buat kelas di pipelines.py. Setiap komponen saluran harus mengimplementasikan metode process_item(self, item, spider), yang menerima item yang di-scrape dan laba-laba yang menghasilkannya.
Berikut adalah contoh Saluran Item yang menyimpan data dalam basis data SQLite:
import sqlite3
class SQLitePipeline(object):
def __init__(self):
self.conn = sqlite3.connect('articles.db')
self.cursor = self.conn.cursor()
self.cursor.execute('''
CREATE TABLE IF NOT EXISTS articles (
title TEXT,
url TEXT
)
''')
def process_item(self, item, spider):
self.cursor.execute('''
INSERT INTO articles (title, url) VALUES (?, ?)
''', (item['title'], item['url']))
self.conn.commit()
return item
def close_spider(self, spider):
self.conn.close()
Untuk mengaktifkan Saluran Item, Anda perlu menambahkannya ke pengaturan ITEM_PIPELINES di settings.py:
# settings.py
ITEM_PIPELINES = {
'myproject.pipelines.SQLitePipeline': 300,
}
Angka 300 mewakili prioritas saluran. Saluran dengan angka yang lebih rendah dieksekusi terlebih dahulu.
Menskalakan Proyek Scrapy Anda
Untuk proyek pengikisan skala yang sangat besar, Anda mungkin perlu mendistribusikan laba-laba Scrapy Anda di beberapa mesin. Berikut adalah beberapa strategi untuk menskalakan Scrapy:
- Kluster Scrapy: Kluster Scrapy adalah kerangka kerja untuk menjalankan laba-laba Scrapy pada kluster mesin. Ia menggunakan Redis untuk pengiriman pesan dan Celery untuk penjadwalan tugas.
- Scrapyd: Scrapyd adalah layanan untuk menyebarkan dan menjalankan laba-laba Scrapy. Ia memungkinkan Anda untuk dengan mudah menyebarkan laba-laba ke server dan mengelola eksekusinya.
- Docker: Gunakan Docker untuk mengontainerisasi laba-laba Scrapy Anda, sehingga mudah untuk menyebarkan dan menjalankannya di mesin apa pun yang mendukung Docker.
- Layanan Pengikisan Berbasis Cloud: Pertimbangkan untuk menggunakan layanan pengikisan web berbasis cloud yang menangani infrastruktur dan penskalaan untuk Anda. Contohnya termasuk: Apify, Zyte (sebelumnya Scrapinghub), dan Bright Data. Ini sering menawarkan proxy terkelola dan layanan pemecahan CAPTCHA.
Pertimbangan Etis dan Praktik Terbaik
Pengikisan web harus selalu dilakukan secara etis dan bertanggung jawab. Berikut adalah beberapa praktik terbaik yang harus diikuti:
- Hormati Robots.txt: Selalu periksa dan patuhi file
robots.txt. - Hindari Kelebihan Beban Server: Terapkan penundaan dan batasi jumlah permintaan yang Anda buat per detik.
- Bersikap Transparan: Identifikasi diri Anda sebagai scraper dengan menyertakan tajuk User-Agent yang dengan jelas menyatakan tujuan Anda.
- Dapatkan Izin: Jika Anda meng-scrape data untuk tujuan komersial, pertimbangkan untuk menghubungi pemilik situs web untuk mendapatkan izin.
- Patuhi Ketentuan Layanan: Tinjau dengan cermat ketentuan layanan situs web dan pastikan bahwa aktivitas pengikisan Anda mematuhi mereka.
- Gunakan Data Secara Bertanggung Jawab: Gunakan data yang di-scrape secara bertanggung jawab dan hindari pelanggaran hak cipta atau hak kekayaan intelektual apa pun. Perhatikan masalah privasi saat meng-scrape data pribadi. Pastikan kepatuhan terhadap GDPR, CCPA, dan peraturan privasi data relevan lainnya.
Teknik Scrapy Tingkat Lanjut
1. Menggunakan Pemilih XPath:
Meskipun pemilih CSS seringkali cukup, XPath menyediakan cara yang lebih ampuh dan fleksibel untuk menavigasi dan memilih elemen dalam dokumen HTML atau XML. Misalnya:
response.xpath('//h1/text()').get() # Memilih konten teks dari tag <h1> pertama
2. Menangani Paginasi:
Banyak situs web menggunakan paginasi untuk memecah konten menjadi beberapa halaman. Untuk meng-scrape data dari semua halaman, Anda perlu mengikuti tautan paginasi. Berikut adalah contohnya:
def parse(self, response):
for article in response.css("article"): # Sesuaikan pemilih CSS sesuai kebutuhan
item = ArticleItem()
item['title'] = article.css("h2 a::text").get()
item['url'] = article.css("h2 a::attr(href)").get()
yield item
next_page = response.css("li.next a::attr(href)").get()
if next_page is not None:
yield response.follow(next_page, self.parse)
3. Menggunakan Panggilan Balik Permintaan:
Panggilan balik permintaan memungkinkan Anda untuk merantai permintaan bersama-sama dan memproses hasil dari setiap permintaan dalam fungsi panggilan balik terpisah. Ini dapat berguna untuk meng-scrape situs web dengan pola navigasi yang kompleks.
4. Menggunakan Sinyal Scrapy:
Sinyal Scrapy memungkinkan Anda untuk terhubung ke berbagai peristiwa dalam proses pengikisan, seperti saat laba-laba mulai, saat item di-scrape, atau saat permintaan selesai. Anda dapat menggunakan sinyal untuk melakukan tindakan khusus, seperti pencatatan, pemantauan, atau penanganan kesalahan.
Scrapy vs. Alat Pengikisan Web Lainnya
Meskipun Scrapy adalah kerangka kerja yang ampuh, ada alat pengikisan web lain yang tersedia. Berikut adalah perbandingan Scrapy dengan beberapa alternatif populer:
- Beautiful Soup: Beautiful Soup adalah pustaka Python untuk mengurai HTML dan XML. Lebih mudah digunakan daripada Scrapy untuk tugas pengikisan dasar, tetapi tidak memiliki fitur canggih Scrapy untuk menangani pengikisan skala besar. Beautiful Soup sering digunakan bersama dengan pustaka seperti
requests. - Selenium: Selenium adalah alat otomatisasi browser yang dapat digunakan untuk meng-scrape situs web yang sangat bergantung pada JavaScript. Selenium bisa jadi lebih lambat dan lebih padat sumber daya daripada Scrapy, tetapi diperlukan untuk meng-scrape konten dinamis yang tidak dapat diakses dengan mudah dengan metode tradisional.
- SDK Apify (Node.js): Apify menawarkan SDK untuk Node.js yang memungkinkan Anda untuk membuat peng-scrape web dan alat otomatisasi. Ia menyediakan fitur yang mirip dengan Scrapy, termasuk pengantrian permintaan, manajemen proxy, dan penyimpanan data.
Alat terbaik untuk proyek Anda bergantung pada persyaratan tertentu. Scrapy adalah pilihan yang bagus untuk proyek pengikisan skala besar yang memerlukan kerangka kerja yang kuat dan fleksibel. Beautiful Soup cocok untuk tugas pengikisan yang lebih sederhana. Selenium diperlukan untuk meng-scrape konten dinamis. SDK Apify menawarkan alternatif untuk pengembang Node.js.
Contoh Aplikasi Scrapy di Dunia Nyata
Scrapy digunakan dalam berbagai aplikasi, termasuk:
- E-niaga: Memantau harga produk, melacak aktivitas pesaing, dan mengumpulkan ulasan produk.
- Keuangan: Mengumpulkan data keuangan, melacak harga saham, dan memantau sentimen berita.
- Pemasaran: Melakukan riset pasar, mengidentifikasi prospek, dan memantau tren media sosial.
- Jurnalisme: Menyelidiki cerita, mengumpulkan data untuk analisis, dan memeriksa fakta informasi.
- Riset: Mengumpulkan data untuk riset akademis dan studi ilmiah.
- Ilmu Data: Membangun kumpulan data pelatihan untuk model pembelajaran mesin.
Misalnya, sebuah perusahaan di Jerman mungkin menggunakan Scrapy untuk memantau harga pesaing di berbagai platform e-niaga. Sebuah lembaga penelitian di Jepang dapat menggunakan Scrapy untuk mengumpulkan data dari publikasi ilmiah untuk meta-analisis. Sebuah agensi pemasaran di Brasil dapat menggunakan Scrapy untuk melacak penyebutan media sosial dari klien mereka.
Kesimpulan
Scrapy adalah kerangka kerja yang ampuh dan serbaguna untuk membangun solusi pengikisan web skala besar. Dengan memahami arsitekturnya, menguasai komponen intinya, dan mengikuti praktik terbaik, Anda dapat memanfaatkan potensinya untuk mengekstrak data berharga dari web. Baik Anda melakukan riset pasar, memantau aktivitas pesaing, atau membangun aplikasi kaya data, Scrapy memberdayakan Anda untuk membuka kekayaan informasi yang tersedia secara online. Ingatlah untuk selalu meng-scrape secara etis dan bertanggung jawab, menghormati ketentuan layanan situs web dan peraturan privasi data.
Sumber Daya Pembelajaran Lebih Lanjut
- Dokumentasi Scrapy: https://docs.scrapy.org/en/latest/
- Blog Zyte (sebelumnya Scrapinghub): https://www.zyte.com/blog/
- Tutorial Real Python: https://realpython.com/tutorials/web-scraping/
- GitHub (contoh Scrapy): Cari GitHub untuk "tutorial scrapy" atau "contoh scrapy" untuk banyak proyek sumber terbuka.